www.gusucode.com > VC++ 三维图形生成和察看工具 > VC++ 三维图形生成和察看工具/code/mesh/DialogWmf.cpp
//Download by http://www.NewXing.com // DialogWmf.cpp : implementation file // #include "stdafx.h" #include "mesh.h" #include "DialogWmf.h" #include "MeshDoc.h" #include "MeshView.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CDialogWmf dialog CDialogWmf::CDialogWmf(CWnd* pParent /*=NULL*/) : CDialog(CDialogWmf::IDD, pParent) { //{{AFX_DATA_INIT(CDialogWmf) m_Ratio = 30.0; m_RatioNbFaces = 0.0f; //}}AFX_DATA_INIT } CDialogWmf::CDialogWmf(CWnd* pParent, CMeshDoc *pDoc) : CDialog(CDialogWmf::IDD, pParent) { m_pDoc = pDoc; m_ColorLine = RGB(0,0,0); m_ColorFace = RGB(255,255,255); m_Mode = MODE_LINE; m_Ratio = 30.0; m_RatioNbFaces = 1.0f; } //********************************* // OnInitDialog //********************************* BOOL CDialogWmf::OnInitDialog() { CDialog::OnInitDialog(); ((CButton *)GetDlgItem(IDC_RADIO_LINE))->SetCheck(1); ((CButton *)GetDlgItem(IDC_RADIO_FACE))->SetCheck(0); // CG: The following block was added by the ToolTips component. { // Create the ToolTip control. m_tooltip.Create(this); m_tooltip.Activate(TRUE); m_tooltip.AddTool(GetDlgItem(IDC_EDIT_RATIO_NBFACES), "Enter the face number ratio (1.0 means that every face are taken into account)"); m_tooltip.AddTool(GetDlgItem(IDC_EDIT_RATIO), "Select the scaling ratio (30.0 is default)"); m_tooltip.AddTool(GetDlgItem(IDC_COLOR_FACE), "Click into this frame to select the face color"); m_tooltip.AddTool(GetDlgItem(IDC_COLOR_LINE), "Click into this frame to select the line color"); m_tooltip.AddTool(GetDlgItem(IDC_RADIO_FACE), "Faces are sorted according to z, filled and outlined"); m_tooltip.AddTool(GetDlgItem(IDC_RADIO_LINE), "Edges are painted without sorting nor culling"); } return TRUE; } void CDialogWmf::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CDialogWmf) DDX_Control(pDX, IDC_COLOR_FACE, m_FrameFace); DDX_Control(pDX, IDC_COLOR_LINE, m_FrameLine); DDX_Text(pDX, IDC_EDIT_RATIO, m_Ratio); DDX_Text(pDX, IDC_EDIT_RATIO_NBFACES, m_RatioNbFaces); DDV_MinMaxFloat(pDX, m_RatioNbFaces, 1.e-003f, 1.f); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CDialogWmf, CDialog) //{{AFX_MSG_MAP(CDialogWmf) ON_BN_CLICKED(ID_BUTTON_RUN, OnButtonRun) ON_WM_PAINT() ON_WM_LBUTTONUP() ON_BN_CLICKED(IDC_RADIO_FACE, OnRadioFace) ON_BN_CLICKED(IDC_RADIO_LINE, OnRadioLine) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CDialogWmf message handlers //********************************* // OnButtonRun //********************************* void CDialogWmf::OnButtonRun() { BeginWaitCursor(); UpdateData(TRUE); // Get DC CDC *pDC = m_pDoc->GetView()->GetDC(); ASSERT(pDC); // Get view rect CRect rect; m_pDoc->GetView()->GetClientRect(&rect); rect.InflateRect(5,5); // Create metafile device context HDC hMetaDC = CreateEnhMetaFile(pDC->m_hDC,"metafile.emf",NULL,NULL); if(!hMetaDC) { AfxMessageBox("Unable to create MetaFile"); ReleaseDC(pDC); return; } // Get DC from handle CDC *pMetaDC = CDC::FromHandle(hMetaDC); ASSERT(pMetaDC); pMetaDC->SetMapMode(MM_TEXT); // Position / translation / scale glPushMatrix(); CMeshView *pView = (CMeshView *)m_pDoc->GetView(); glTranslated(pView->m_xTranslation,pView->m_yTranslation,pView->m_zTranslation); glRotatef(pView->m_xRotation, 1.0, 0.0, 0.0); glRotatef(pView->m_yRotation, 0.0, 1.0, 0.0); glRotatef(pView->m_zRotation, 0.0, 0.0, 1.0); glScalef(pView->m_xScaling,pView->m_yScaling,pView->m_zScaling); // Get OpenGL parameters GLdouble modelMatrix[16]; GLdouble projMatrix[16]; GLint viewport[4]; glGetDoublev(GL_MODELVIEW_MATRIX,modelMatrix); glGetDoublev(GL_PROJECTION_MATRIX,projMatrix); glGetIntegerv(GL_VIEWPORT,viewport); // Start rendering via std GDI 2D drawing functions CSceneGraph3d *pScene = &m_pDoc->m_SceneGraph; for(int i=0;i<pScene->NbObject();i++) { CObject3d *pObject = pScene->GetAt(i); if(pObject->GetType() == TYPE_MESH3D) // meshes only // The line mode (no sort) if(m_Mode == MODE_LINE) ((CMesh3d *)pObject)->glDrawProjectLine(pMetaDC, modelMatrix, projMatrix, viewport, m_ColorLine, m_Ratio, rect.Height()); else // The face mode (faces are z-sorted // according to their barycenter) ((CMesh3d *)pObject)->glDrawProjectFace(pMetaDC, modelMatrix, projMatrix, viewport, m_ColorLine, m_ColorFace, m_Ratio, rect.Height(), m_RatioNbFaces); } glPopMatrix(); // Close metafile HENHMETAFILE hMetaFile = CloseEnhMetaFile(hMetaDC); // Fill the clipboard (direct sent to wmf2eps or // any windows app such as Powerpoint) OpenClipboard(); EmptyClipboard(); SetClipboardData(CF_ENHMETAFILE,CopyEnhMetaFile(hMetaFile,NULL)); CloseClipboard(); // Cleanup DeleteEnhMetaFile(hMetaFile); ReleaseDC(pDC); EndWaitCursor(); } void CDialogWmf::OnPaint() { CPaintDC dc(this); // device context for painting CRect rect; CBrush brush; // Line color m_FrameLine.GetWindowRect(&rect); ScreenToClient(&rect); brush.CreateSolidBrush(m_ColorLine); dc.FillRect(&rect,&brush); brush.DeleteObject(); // Face color m_FrameFace.GetWindowRect(&rect); ScreenToClient(&rect); brush.CreateSolidBrush(m_ColorFace); dc.FillRect(&rect,&brush); brush.DeleteObject(); } //********************************* // OnLButtonUp //********************************* void CDialogWmf::OnLButtonUp(UINT nFlags, CPoint point) { CRect rect; // Line color m_FrameLine.GetWindowRect(&rect); ScreenToClient(&rect); if(rect.PtInRect(point)) { CColorDialog dlg(m_ColorLine); if(dlg.DoModal()==IDOK) { m_ColorLine = dlg.GetColor(); InvalidateRect(&rect,FALSE); } } // Face color m_FrameFace.GetWindowRect(&rect); ScreenToClient(&rect); if(rect.PtInRect(point)) { CColorDialog dlg(m_ColorFace); if(dlg.DoModal()==IDOK) { m_ColorFace = dlg.GetColor(); InvalidateRect(&rect,FALSE); } } CDialog::OnLButtonUp(nFlags, point); } /////////////////////////////////// // Options (face or line) /////////////////////////////////// //********************************* // OnRadioFace //********************************* void CDialogWmf::OnRadioFace() { m_Mode = MODE_FACE; ((CButton *)GetDlgItem(IDC_RADIO_LINE))->SetCheck(0); ((CButton *)GetDlgItem(IDC_RADIO_FACE))->SetCheck(1); } //********************************* // OnRadioFace //********************************* void CDialogWmf::OnRadioLine() { m_Mode = MODE_LINE; ((CButton *)GetDlgItem(IDC_RADIO_LINE))->SetCheck(1); ((CButton *)GetDlgItem(IDC_RADIO_FACE))->SetCheck(0); } BOOL CDialogWmf::PreTranslateMessage(MSG* pMsg) { // CG: The following block was added by the ToolTips component. { // Let the ToolTip process this message. m_tooltip.RelayEvent(pMsg); } return CDialog::PreTranslateMessage(pMsg); // CG: This was added by the ToolTips component. }